CAP−Xインタープリタ ――――――――――――――――――――――――――――――――――――――― I/O 1980年 5月号掲載 MZ−80K マシン語 02000H−02A03H スタート     02000H ウォームスタート 02060H 起動方法 モニタからLOAD ――――――――――――――――――――――――――――――――――――――― このところ『明石ミニコン研究会』によるCAP−Xの連載が続いていますが、 MZ−80で動くCAP−Xアセンブラを作ってみましたので紹介します。 プログラムは、『テキスト・エディタ』、『CAP−Xアセンブラ』 『COMP−Xシミュレータ』の3ユニットから成ります。 このシステムはクロスアセンブラと違い、 CAP−Xが、実際にCOMP−Xのオブジェクトを生成し、 シミュレータがそれを解釈実行するというインタープリタ形式なので、 実行速度はやや遅くなりますが、COMP−Xの動作が理解しやすく、 直接メモリに書いた機械語プログラムを実行させることができるなどの 利点があります。 MZ−80をお持ちの方は、ぜひ、ご利用ください。 ・−−−−−−−−−−−−−−−−−−・ |     システムの概要      | ・−−−−−−−−−−−−−−−−−−・ システムの流れは、図1のようになります。 まず、エディタでソース・テキストを作成します。 使用できるコマンドは表1にまとめてありますが、 詳細は各項で説明します。 図1 プログラムの流れ            ・−−−−・            |TAPE|            ・−−−−・  ・−−−−−−−・   ↑  |OS|エディタ|−−−| テープ・ファイル  ・−−−−−−−・   ↓   ||  編集↑ ・−−−−−−−−・   ||    ・→|ソース・テキスト|   ||      ・−−−−−−−−・   || ・−−−−−・ |        |・→|CAP−X|−|↓   |  |アセンブラ| |   |  ・−−−−−・ ↓   |       ・−−−−−−・   |       |COMP−X|   |       |オブジェクト|   |       ・−−−−−−・   | ・−−−−−−・ |   ・→|COMP−X|−|↓     |シミュレータ| |     ・−−−−−−・ |              ↓            ・−−−・            |実 行|            ・−−−・ 表1 COM−Xシステム・コマンド  ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・  |Is|Insert | Pの指す行の上にsを挿入     |  |I |       | 入力モード(連続してsを挿入)  |  |Td|Type   | Pの位置からd行を出力      |  |T |       | バッファの内容を令部出力     |  |Kd|Kill   | Pの位置からd行を抹消      |  |Cs|Correct| Pの指す行の内容をsに変更    |  |S |Search | Pの位置から下ヘsを検索     |  |B |Begin  | Pをバッファの先頭へ移動     |  |Z |Zee    | Pをバッファの最後へ移動     |  |Ud|Up     | Pをd行上昇           |  |Dd|Down   | Pをd行下降           |  |W |Write  | バッファの内容をMTに出力    |  |R |Read   | Pの指す行の上にMTから付加入力 |  |−−+−−−−−−−+−−−−−−−−−−−−−−−−−−|  |# |Printer| プリンタのリスト・モードを反転  |  |& |Restart| バッファをクリア・#をoff   |  |! |Monitor| MZ−80モニタヘジャンプ    |  |−−+−−−−−−−+−−−−−−−−−−−−−−−−−−|  |A1|Pass 1 | アセンブラにラベル名を登録    |  |A2|Pass 2 | アセンブルを実行して出力     |  |A3|Pass 3 | オブジェクトをメモリに格納    |  |−−+−−−−−−−+−−−−−−−−−−−−−−−−−−|  |/ |Run    | プログラムを指定した番地から実行 |  |/n|       | プログラムをn番地から実行    |  |* |Clear  | GR0〜3、CCをクリア     |  |S0|Disable| シミュレータのコールを禁止    |  |S1|Enable | シミュレータのコールを許可    |  ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・   s:文字列 d,n:10進数 図2に示すように、ソースはメモリの3000番地以降に格納されます。 ソース・エリアの終端はOBJSTで、 オブジェクトの格納される領域との境界です。 このプログラムではOBJST=5000番地ですが、 メモリのサイズに応じて変えられるようになっています。 ソースはカセットMTに記録保存できます。 また、MTからの入力のときは、 Iコマンドと同様に付加入力の形式をとっているので、 複数のプログラムを後から結合することができます。 さて、ソースの入力が終わったら、アセンブルを行ないます。 この過程でエラーが見付かった場合は、 エディタに戻ってソースを修正します。 エラーがなければ、 オブジェクトを前述のOBJST以降にロードして、 シミュレータに制御を渡せば命令が実行されます。 システム・プログラムのサイズは約2.5Kバイトで、 ワーク・エリアとソース、オブジェクトのバッファを合わせても、 MZ−80Kの標準システム(RAM20Kバイト実装)で充分走ります。 本システムでのプログラム例として、 フィボナッチ数列のリストと実行結果を実行例1に示します。 図2 アドレス・マップ           ・−−−−−−−−−−−−・ (Cold Start) 2000|            | (Warm Start) 2060|−−−−−−−−−−−−|           | テキスト・エディタ  |           |   (含むOS)   |         22FA|−−−−−−−−−−−−|           |            |           | CAP−Xアセンブラ |           |            |         26F4|−−−−−−−−−−−−|           |            |           |COMP−Xシミュレータ|         2997|−−−−−−−−−−−−|           |  ワーク・エリア   |         2A01|−−−−−−−−−−−−|           |            |           |  ラペル・テーブル  |           |            |         3000|−−−−−−−−−−−−|           |            |           |            |           |ソース・テキスト・エリア|           |            |           |            |           |−−−−−−−−−−−−|      OBJST=5000|−−−−−−−−−−−−|0     (可変): |            |1         : |            |:      OBJST+2*N |←――――――――――→|N           |Z80の       COMP-Xの|           |アドレス    アドレス|           |            | 実行例1 プログラム例  a)ソース・リスト       〜フィボナッチ数例〜   ;   ; FIBONACCI SERIES            c)実行結果   ; 1   P1:START 0 2   LOP:LD 1,FB1 3   LD 2,FB1 5   ADD 1,FB2 8   ST 1,FB1 13   ST 2,FB2 21   WRITE 1,10 34   JC 2,LOP 55   HJ 0,P1 89   FB1:CONST 0001 144   FB2:CONST 0000 233   END P1 337    610  b)アセンブル・リスト 987   0000 ; 1597   0000 ; FIBONACCI SERIES 2584   0000 ; 4181   0000 FP1: START 0 6765   0000 C408 LOP: LD 1,FB1 10946   0001 C808 LD 2,FB1 17711   0002 A409 ADD 1,FB2 28657   0003 D408 ST 1,FB1 46368   0004 D809 ST 1,FB2   0005 740A WRITE 1,10   0006 2800 HJ 0,P1   0008 0001 FB1: CONST 0001   0009 0000 FB2: CONST 0000   0010 END P1 ・−−−−−−−−−−−−−−−−−・ |    テキスト・エディタ    | ・−−−−−−−−−−−−−−−−−・ ここはシステム・プログラムのエントリであり、簡易なOS機能を持ちます。 アセンブラやシミュレータヘの命令も、すべてエディタ・モードで行ないます。 コマンドはすべてサブルーチンになっていて、 実行のときは、あらかじめ帰り番地をプッシュしておき、 テーブルをサーチして分岐先を求め、ジャンプします。 スタックの深さがわかりにくい場所からは、強引にジャンプで戻ってきます。 エディタ・モードでは、常時、“>”記号(プロンプト)が出力されます。 次に、エディタ用コマンドの詳細を説明します。 ●エディタ用コマンド ・−−−−−−−−−−−−−−−−−・ |I(Insert) コマンド   | ・−−−−−−−−−−−−−−−−−・ たとえば、[I][A][B][C][CR]と打つと、P(ポインタ)の指す行の上に “ABC”の1行が入力されます。 連続して入力したい場合は、1度[I][CR]と打ちます。 この状態を入力モードと呼び、プロンプタは出力されません。 そこでs1[CR]s2[CR]…(sは文字列)と入力していきます。 単に[CR]を打てば、エディタ・モードに戻ります。 ・−−−−−−−−−−−−−−−−−・ |T(Type) コマンド     | ・−−−−−−−−−−−−−−−−−・ [T][1][0][CR]と打つと、 Pの指す行を含めて10行が出力されます。 一般に[T]d[CR](1≦d≦255)の形を取ります。 実行後、Pの位置は変化しません。 [T][CR]と打つと、 Pの位置に関係なくバッファの内容が全部出力されます。 出力は[BREAK]キーにより中断できます。 ・−−−−−−−−−−−−−−−−−・ |K(Kill) コマンド     | ・−−−−−−−−−−−−−−−−−・ 行の抹消に用います。[K]d[CR]と打てば、P以下d行力削除されます。 ・−−−−−−−−−−−−−−−−−・ |C(Correct) コマンド  | ・−−−−−−−−−−−−−−−−−・ 1行修正するのに用います。[C][A][B][C][CR]と打つと、 現在指している行の内容が“ABC”に変わります。 一般に[C]s[CR](s:文字列)の形をとります。 ・−−−−−−−−−−−−−−−−−・ |S(Search) コマンド   | ・−−−−−−−−−−−−−−−−−・ 文字列の検索に用います。 [S]s[CR]と打つと、 Pの位置から下へ向かってsを探し、 最初に発見した行の先頭にPをセットしてその行を出力します。 もし、存在しない場合はPは移動しません。 ・−−−−−−−−−−−−−−−−−・ |B(Begin) コマンド    | ・−−−−−−−−−−−−−−−−−・ Pをバッファの先頭に持っていきます。 すなわち、実行後Pはテキストの最初の行を指すことになります。 ・−−−−−−−−−−−−−−−−−・ |Z(Zee) コマンド      | ・−−−−−−−−−−−−−−−−−・ Pをバッファの最後に持っていきます (Zはアルファベットの最後の文字なので)。 実行後、Pはテキストの最後の行の次 (メモリにはゼロが書き込まれている)を指します。 ・−−−−−−−−−−−−−−−−−・ |U(Up) コマンド       | ・−−−−−−−−−−−−−−−−−・ Pをd行上げるのに用います。 [U]d[CR]と打ちます。 もし、バッファの先頭に達してしまったら、そこで止まります。 この場合Bコマンド実行後と同じになります。 ・−−−−−−−−−−−−−−−−−・ |D(Down) コマンド     | ・−−−−−−−−−−−−−−−−−・ Pをd行下げるのに使います。 用法はUコマンドと同様。 ・−−−−−−−−−−−−−−−−−・ |&(Restart) コマンド  | ・−−−−−−−−−−−−−−−−−・ バッファ内をクリアして、プリンタ・モードをOffにします。 プログラムを最初から打ち直すのに使います。 ●周辺制御用コマンド ・−−−−−−−−−−−−−−−−−・ |W(Write) コマンド    | ・−−−−−−−−−−−−−−−−−・ カセットテープ・ファイルにバッファの内容を出力します。 このとき、[FILENAME?]と聞いてくるので、 適当な名前を付けることができます。 ・−−−−−−−−−−−−−−−−−・ |R(Read) コマンド     | ・−−−−−−−−−−−−−−−−−・ カセットテープ・ファイルから、ソース・テキストを入力します。 バッファ内にソース・テキストが存在するときは、 Pの指す行の上にIコマンドと同様に付加入力されます。 ・−−−−−−−−−−−−−−−−−・ |#(Printer) コマンド  | ・−−−−−−−−−−−−−−−−−・ プリンタヘの出力をon−offします。 初期状態はoffがであり、1回入力するごとに反転します。 onの状態では、プリンタ、CRTの両方に出力されます。 ただし、アセンブル・リストをとるときに、 CRTの方は40文字を越える分か無視されます。 もし、#がonで、プリンタが接続されていないときに出力をしようとすると、 システムは数秒間待った後、自動的に#をoffにして出力を再開します。 ・−−−−−−−−−−−−−−−−−・ |!(Monitor) コマンド  | ・−−−−−−−−−−−−−−−−−・ MZ−80のモニタヘジヤンプします。 復帰するときは、GOTO$2060(Warm Start)とすれば、 バッファをクリアせずにエディタヘ戻ります。 ・−−−−−−−−−−−−−−−−−・ |   CAP−Xアセンブラ    | ・−−−−−−−−−−−−−−−−−・ このCAP−Xは什様書にできるだけ近く作られていますが、 若干の注意点があるので述べます。 ■行  行の終わりはCR(ODH)で示されます。  1行は80字以内であり、空白だけからなる行は誤りです。  別のセットのエディタを使用するときは注意してください。 ■ラベル  すべての命令にラペルを付けることができます。  ラペルの直後には“:”(コロン)を書かなければなりません。  ラベルは最初の3文字が有効です。 ■命令  CAP−Xは表2のように、拡張された16種の命令  と5種の擬似命令とから成ります。命令も最初の3文字  で識別しているので、省略形が可能となります。  ニモニックとオペランドの間には1つ以上の空白を入れます。 ■注釈  “;”(セミコロン)以降が全部注釈と見なされます。  行の始めに置くと行全体が注釈になります。  途中に置いた“;”は出力のときに41桁目にタブされるので、  命令の後に書いた注釈をCRTで見ることはできません。 ■エラーメッセージ  エラーメッセージはPass2のときに  行の左端に英文字1字で出力されます(実行例2)。  これには7通りあり、表3のような意味を持ちます。  アセンブラに制御を渡すには、先頭にAを打ちます。  次に来る数字(1〜3)によって、各段階の動作を行ないます。  表2 COMP−X命令語表(○印は新設命令)    CAP−X用命令  ・---------------------------------------------------------------・  | 0 |HJ |SC←EA 注1) Halt until CR(復改) 注1)EA:実効アドレス |  | 1 |JNZ |if(GR)≠0 then SC←EA else SC←SC+1 |  | 2 |JC | ・- 0 SC←SC+1 |  | | | | 1 if cc then SC←EA else SC←SC+1 |  |  | |GR=| 2 if cc then SC←SC+1 else SC←EA |  | | | ・- 3 SC←EA |  | 3 |JSR |(GR)←SC+1,SC←(EA),BR←(EA),上位8ビット |  | 4 |SFT | ・- ・--------------・ |  | | | | 0|::|―→GR―→ | | | | | | ・→・--------------・ | | | |XR=| |___/ | | | | | ・--------------・ |  | | | | 1|::|―→GR―→ |←0 | | | | ・- ・--------------・ |  |(5)|USR |GR=|0 全レジスタの値を表示、かつ変更可能 |  | | | |1 コール可能の時 Z80の絶対番地に対してCALL (EA) |  |(6)|READ |(GR)に打鍵により数値を入力、AD=10(10進数),16(16進数) |  |(7)|WRITE|(GR)をAD進数で出力、 2≦AD≦16 |  | | |AD=0のとき、改行のみ |  | 8 |LAI |(GR)←EA下位8ビット |  |(9)|OR |(GR)←(GR)∨(EA) |  | A |ADD |(GR)←(GR)+(EA)、CC←SIGN |  | B |SUB |(GR)←(GR)−(GR)−(EA)、CC←SIGN |  | C |LD |(GR)←(EA) |  | D |ST  |(EA)←(GR) |  | E |AND |(GR)←(GR)∧(EA) |  | F |EOR |(GR)←(GR)∀(EA) |  ・---------------------------------------------------------------・ CAP−X用擬似命令(○印は新設命令)  ・---------------------------------------------------------------・  | |START| d |以降のプログラムをd番地から格納 |  | |END |(d)|d番地から実行開始(サブルーチンにはdは不要) |  | |CONST| h |16進定数1語 |  | |RESV | d |d語の領域を確保 |  | |ADCON| d |アドレス定数1語 |  |O |EQU | d |ラベルの値を定義 |  ・---------------------------------------------------------------・   d:10進数またはラペル h:16進数4桁 実行例2 エラーメッセージの出力例   0000 ;   0000 ; ERROR MESSAGE SAMPLE   0000 ;   0000 PPP: START 0  Q 0000 2000 XOR 1,2,1  M 0001 C40E DBL: LD 1,ABC   0002 6C10 READ 3,16  C 0003 2000 SUB 4,KKK   0004 7C0D WRITE 3,13  M 0005 DD1D DBL: ST 3,KKK,1   0006 A500 ADD 1,0,1   0007 A500 ADD 1,,1  C 0008 2000 ADD 1,1,  U 0009 2800 JC 2,NOW   0010 ; F 0010 2000 SFT 1,1,1   0011 9F1C CR 3,GG,3  N 0012 2000 AND 1,3S   0013 0000 HJ 0,PPP   0014 ABC: RESV 14  N 0028 2000 GG: CONST 1   0029 FFFF KKK: CONST FFFF   0030 END PPP  * ASSEMBLE END 001E 表3 CAP−Xアセンブラのエラーメッセージ  ・−−−−−−−−−−−−−・  | U |ラベルの未定義  |  | M |ラベルの多重定義 |  | Q |ニモニックの誤り |  | C |オペランドの誤り |  | N |数値表現の誤り  |  | F |フォーマットの誤り|  | R |ソースの形式の誤り|  ・−−−−−−−−−−−−−・ ●アセンブラ用コマンド ・−−−−−−−−−−−−−−−−−・ |A1(Pass1) | ・−−−−−−−−−−−−−−−−−・ ラベルを検索してラベル・テーブルに登録します。 このとき、ラベル多重定義のチェックが行なわれます。 ・−−−−−−−−−−−−−−−−−・ |A2(Pass2) | ・−−−−−−−−−−−−−−−−−・ アセンブルを実行して、アドレスとオブジェクト・コードを出力します。 また、エラーメッセージも出力されます。 中断したいときは、[BREAK]キーを押してください。 ・−−−−−−−−−−−−−−−−−・ |A3(Pass3) | ・−−−−−−−−−−−−−−−−−・ アセンブルを実行して、オブジェクト・コードを実効アドレスにロードします。 ここで、図2に示すように、COMP−XとZ80のアドレスは互いに異なり、 COMP−Xの0番地がZ80のOBJSTに、 N番地がOBJST+2*Nに対応します。 通常、アセンブルはA1→A2→A3の順に行ないます。 A2は省略しても構いませんが、 A1はラベルがあるときは必ず実行してください。 ・−−−−−−−−−−−−−−−−−・ |COM−X シミュレータ     | ・−−−−−−−−−−−−−−−−−・ COMP−Xシミュレータは、 メモリ上のCOMP−X命令を逐次解釈して実行するユニットです。 COMP−X命令は、 CAP−Xアセンブラが生成したものも、 マシン語モニタなどで書き込んだものも同様に扱われます。 動作中はBCレジスタがSC(制御カウンタ)の役目をします。 また、主にHLレジスタが他の16ビットのパラメータの受け渡しをしています。 COMP−Xの動作については、 命令解析部のNSチャートを図3に掲げましたので参照してください。 図3 COMP−X命令解析部NSチャート 〔 〕内は命令コード  〔0〕HJ         〔5〕USR  ・−−−−−−−−−・   ・−−−−−−−−−−−−・  |  JEFF   |   |\ GRフィールド  /|  |−・−−−−−−−|   |0\        /1|  | | GETKY |   |−−−−−−−−−−−−|  | |−−−−−−−|   | レジスタの|\ コール可能/ |  | |復改ならRET|   |値を表示|no\  /yes |  | |BREAKなら|   |−−−−−−−−−−−−|  | |エディタへ  |   | レジスタの|  | LODEF |  | ・−−−−−−−|   |値を修正|  |    |  | UNTIL 0 |   |−−−−−−−−−−−−|  ・−−−−−−−−−・   |       | JP(HL) |                ・−−−−−−−−−−−−・  〔1〕JNZ        〔6〕READ  ・−−−−−−−−−・   ・−−−−−−−−−・  |  LODGR  |   |\ADフィールド/|  |−−−−−−−−−|   |10\     /16|  |\  GR=0 /|   |−−−−−−−−−|  | \     / |   |10進 |16進 |  |yes \   / no |   |任意桁 |4桁入力|  |−−−−−−−−−|   |入力  |    |  |   |JEFF |   |−−−−−−−−−|  ・−−−−−−−−−・   |  STOGR  |                ・−−−−−−−−−・  〔2〕JC         〔7〕WRITE  ・−−−−−−−−−−・  ・−−−−−−−−−・  |\   (GR,CC)  /|  |  LODGR  |  | \      / |  |−−−−−−−−−|  |  \    /  |  |ADフィールドの |  |(0,X) \  / (3,X)|  |記法で出力    |  |(1,0)  \/  (1,1)|  ・−−−−−−−−−・  |(2,1)  |   (2,0)|  |−−−−+−−−−−|  |    |JEFF |  ・−−−−−−−−−−・  〔3〕JSR        〔8〕LAI  ・−−−−−−−−−・   ・−−−−−−−−−・  |  LODEF  |   |  LODXR  |  |−−−−−−−−−|   |−−−−−−−−−|  | HL←→BC  |   | H←O     |  | BR上位←B  |   | H←L+AD  |  |−−−−−−−−−|   |−−−−−−−−−|  |  STOGR  |   |  STOGR  |  ・−−−−−−−−−・   ・−−−−−−−−−・  〔4〕SFT        〔9〕OR  ・−−−−−−−−−・   ・−−−−−−−−−−・  |  LODGR  |   |   LODEF  |  |−−−−−−−−−|   |−−−−−−−−−−|  | WHILE回数 |   | HL←HL∨DE |  | ・−−−−−−−|   |−−−−−−−−−−|  | |XRフィールド|   |  STOGR   |  | |に応じてシフト|   ・−−−−−−−−−−・  |−−−−−−−−−|  |  STOGR  |  ・−−−−−−−−−・  -----------------------------------------------------------------------  〔A〕ADD        〔E〕AND  ・−−−−−−−−−−・  ・−−−−−−−−−−・  |  LODEG   |  |  LODEG   |  |−−−−−−−−−−|  |−−−−−−−−−−|  | HL←HL+DE |  | HL←HL&DE |  |−−−−−−−−−−|  |−−−−−−−−−−|  | CC←SIGN  |  |  STOGR   |  |−−−−−−−−−−|  ・−−−−−−−−−−・  |  STOGR   |  ・−−−−−−−−−−・  〔B〕SUB        〔F〕EOR  ・−−−−−−−−−−・  ・−−−−−−−−−−−・  |  LODEG   |  |   LODEG   |  |−−−−−−−−−−|  |−−−−−−−−−−−|  | HL←HL−DE |  | HL←HL(+)DE  |  |−−−−−−−−−−|  |−−−−−−−−−−−|  | CC←SIGN  |  |   STOGR   |  |−−−−−−−−−−|  ・−−−−−−−−−−−・  |  STOGR   |  ・−−−−−−−−−−・  〔C〕LD  ・−−−−−−−−・  | LODEF  |  |−−−−−−−−|  | STOGR  |  ・−−−−−−−−・  〔D〕ST  ・−−−−−−−−・  | LODGR  |  |−−−−−−−−|  | STOEF  |  ・−−−−−−−−・  -----------------------------------------------------------------------   LODEG       LODEF        STOEF  ・−−−−−−−−・  ・−−−−−−−−−・  ・−−−−−−−−−・  | LODEF  |  |  SETEF  |  |  DE←HL  |  |−−−−−−−−|  |−−−−−−−−−|  |−−−−−−−−−|  | DE←HL  |  | HL←(HL) |  |  SETEF  |  |−−−−−−−−|  ・−−−−−−−−−・  |−−−−−−−−−|  | LODGR  |               | (HL)←DE |  ・−−−−−−−−・               ・−−−−−−−−−・     JEFF        SETEF        LODXR  ・−−−−−−−−・  ・−−−−−−−−・   ・−−−−−−−−−・  | LODXR  |  | LODXR  |   | HL←(XR) |  |−−−−−−−−|  |−−−−−−−−|   ・−−−−−−−−−・  | B←BR上位 |  | H←BR上位 |  | C←L+AD |  | L←L+AD |    LODGR  ・−−−−−−−−・  |−−−−−−−−|   ・−−−−−−−−−・              |絶対アドレス に変換|   | HL←(GR) |              ・−−−−−−−−・   ・−−−−−−−−−・                    (注1)                            STOGR  注1)COMP−Xの見かけ上のアドレスから、   ・−−−−−−−−−・     Z80の真のアドレスに変換する。      | (GR)←HL |  注2)BCレジスタはSCに用いている。      ・−−−−−−−−−・ ●シミュレータ用コマンド ・−−−−−−−−−−−−−−−−−・ |/(Run) コマンド      | ・−−−−−−−−−−−−−−−−−・ [/][CR]と打つと、 プログラムを、メイン・ルーチンのEND命令が指定する番地から実行します。 同時に、BRの上位8ビットもこの番地にセットされます。 [/]n[CR]と打つと、プログラムをn番地から実行します。 ・−−−−−−−−−−−−−−−−−・ |*(Clear) コマンド    | ・−−−−−−−−−−−−−−−−−・ GR0〜GR3の内容を0クリアし、CCをリセットします。 ・−−−−−−−−−−−−−−−−−・ |$(Call) コマンド     | ・−−−−−−−−−−−−−−−−−・ コール許可フラグをセット・リセットします。 これはUSR命令のXR=1のときに参照されるフラグです。 セットするには[$][1][CR]、リセットするには[$][0][CR]と打ちます。 CAP−XおよびCOMP−Xで扱える命令は表3の通りです。 ここでは拡張命令について説明します。 これらは、COMP−Xの空きコードを利用して作られた命令で、 いずれも1語の長さを持ちます。 ●COMP−X拡張命令 ・−−−−−−−−−−−−−−−−−・ |USR命令            | ・−−−−−−−−−−−−−−−−−・ 最も強力な命令です。 GR=0のとき、全レジスタの値を表示して停止します。 全レジスタとは、SC(16ピット)、BR(16ビット)、 GR0〜3(各16ビット)、CC(1ビット)のことです。 SCは、USR命令の置かれた次の番地(次に実行する番地)を指しています。 これらの値は、カーソル・エディット機能によって変更することができます。 動作は[CR]により、再開します。 GR=1のとき、コール許可フラグがセットされていれば、 実効アドレスが指定する語の内容の番地に対して、 Z80の機械語コールをかけます。 これによってZ80のプログラムとリンク可能になります。 なお、このとき、IXレジスタは使用しているので壊さないよう注意してください。 また、BCレジスタはSCであり、 COMP−Xから見た次の実行すべき番地が格納されており変更可能です。 USR命令を使った例を実行例3に示します。 実行例3 USR命令使用例   0000 ;   0000 ; FLAG TEST   0000 ;   1024 PG1: START 1024   1024 8000 LAI 0,0   1025 8401 LAI 1,1   1026 B8FF LAI 2,255   1027 BE01 LAI 3,1,2   1028 AC09 ADD 3,ONE   1029 5000 USR 0,0   1030 B009 SUB 0,ONE   1031 5000 USR 0,0   1032 0000 HJ 0,PG1   1033 0001 ONE: CONST 001   1034 END PG1    *ASSEMBLE END 040A      SC BR GR0 GR1 GR2 GR3 CC  0406 0400 2000 0001 00FF 0001 0    SC BR GR0 GR1 GR2 GR3 CC  0408 0400 FFFF 0001 00FF 0001 1 ・−−−−−−−−−−−−−−−−−・ |READ命令           | ・−−−−−−−−−−−−−−−−−・ 指定されたGRに、打鍵により数値を入力できます。 数値の記数法は10進および16進のみが許され、 あらかじめADフィールドに宣言しておきます。 16進のときは必ず4桁入力します。 COMP−Xは有効な入力が得られるまで待ちます。 ・−−−−−−−−−−−−−−−−−・ |WRITE命令          | ・−−−−−−−−−−−−−−−−−・ 指定されたGRの内容をADフィールドに宣言した記数法で出力します。 ただし、2≦AD≦16です。 また、特別にAD=0のときは改行だけを行ないます。 【注】READ、WRITE命令は、    明石ミニコン研究会の仕様に合わせてあります。 ・−−−−−−−−−−−−−−−−−・ |OR命令             | ・−−−−−−−−−−−−−−−−−・ ANDやEORと同じように使用できます。 ・−−−−−−・ | おわりに | ・−−−−−−・ マイクロプロセッサの規模も、技術の進歩と社会の要請に応じて 4ビットから8ビット、そして16ビットヘと拡大の一途をたどっています。 近い将来、パーコンの主流も16ビットになることが予想されますが、 CAP−Xが、単なる受験のための言語にとどまらず、 来たるべき時代への布石として少しでも役立つことを願っています。 なお、各プログラム・ユニットの開発にあたって、次の文献を参考にしました。 【】参考文献 ●エディタ部 1)工藤裕司:“PALLを解剖する”、   I/O ’80年1月号、工学社 2)和田英一:マイクロエディタ、   bit増刊 マイクロコンピュータのプログラミング、共立出版 ●アセンブラ部 3)高澤嘉光:“マイクロコンピュータのアセンブラ”、   同上、 ●シミュレータ部 4)明石ミニコン研究会編:“CAP−X勉強室”、   I/O連載中。